#include "displaywidget.h"
#include "ui_displaywidget.h"

displaywidget::displaywidget(QWidget *parent)
    : QWidget(parent), ui(new Ui::displaywidget)
{
    ui->setupUi(this);
    parentWidget = parent;
    currentMenuButton = nullptr; // 初始化当前选中按钮指针
}

displaywidget::~displaywidget()
{
    delete ui;
}

void displaywidget::initializeUI(ENUM_menu menuType)
{
    this->menuType = menuType;
    switch (menuType)
    {
    case UI_H_MENU:
        initHmenu();
        break;
    case UI_V_MENU:
        initVmenu();
        break;
    default:
        break;
    }
}

void displaywidget::initVmenu()
{
    menuWidth = ui->menuWidget->width(); /*记录菜单栏实际大小*/
    ui->toggleButton->setFixedWidth(64); // 图标大小
    ui->menuWidget->setGeometry(0, 0, menuWidth, parentWidget->height());
    ui->contentHWidget->setGeometry(menuWidth, 0, parentWidget->width(), parentWidget->height());
    ui->toggleButton->setGeometry(menuWidth, 0, menuWidth / 4, parentWidget->height());
    ui->hmenuwidget->setEnabled(false);
    ui->hmenuwidget->setVisible(false);
}

void displaywidget::initHmenu()
{
    ui->menuWidget->setVisible(false);
    ui->menuWidget->setEnabled(false);
    ui->contentHWidget->setGeometry(0, 0, parentWidget->width(), parentWidget->height());
    ui->toggleButton->setVisible(false);
    ui->toggleButton->setEnabled(false);
    ui->hmenuwidget->setFixedHeight(pixWidth);

    // 确保菜单容器布局
    if (!ui->hmenuwidget->layout())
    {
        QHBoxLayout *hLayout = new QHBoxLayout(ui->hmenuwidget);
        hLayout->setSpacing(8);                   // 固定间隔
        hLayout->setContentsMargins(20, 0, 0, 0); // 左边间距特意设置20,这样排布好看些
        hLayout->addStretch();                    // 保持按钮靠左
    }
}

/**
 * @brief displaywidget::insertAlarmButton 插入报警按钮，显示在菜单最右侧
 * @param menuPath 图标路径
 * @param menuWidget 关联的页面widget
 * @param initialText 初始显示的文字
 */
void displaywidget::insertAlarmButton(QString menuPath, QWidget *menuWidget, const QString &initialText)
{
    if (menuWidget)
    {
        // 复用原有逻辑处理widget
        if (!menuWidget->layout())
        {
            QVBoxLayout *vLayout = new QVBoxLayout(menuWidget);
            vLayout->setContentsMargins(0, 0, 0, 0);
            vLayout->setSpacing(0);
            menuWidget->setLayout(vLayout);
        }

        ui->contentStackedWidget->addWidget(menuWidget);
        ui->contentStackedWidget->setCurrentWidget(menuWidget);

        // 创建报警按钮（特殊处理）
        QPushButton *alarmBtn = new QPushButton();
        alarmBtn->setFixedSize(120, 32);
        alarmBtn->setFlat(true);

        // 设置初始文字
        alarmBtn->setText(QString("报警:%1").arg(initialText));

        // 加载图标并缩放
        QPixmap pix(menuPath);
        alarmBtn->setIcon(pix.scaled(24, 24, Qt::KeepAspectRatio, Qt::SmoothTransformation));
        alarmBtn->setIconSize(QSize(24, 24));

        // 设置按钮样式，美化外观 - 黄色底色的长方形圆角按钮，图标和文字并排显示
        alarmBtn->setStyleSheet(
            "QPushButton {"
            "   background-color: #ffc53d;"
            "   border-radius: 6px;"
            "   color: white;"
            "   font-weight: bold;"
            "   font-size: 12px;"
            "   text-align: left;"
            "   padding-left: 20px;" // 为图标留出空间
            "}"
            "QPushButton:hover {"
            "   background-color: #ffd666;"
            "}");

        // 获取图标名称作为key
        QString iconName = QFileInfo(menuPath).fileName();
        // 存入统一的map中
        m_menuButtonsMap[iconName] = alarmBtn;

        // 插入到水平菜单布局中，放在最右侧（在stretch之后）
        QHBoxLayout *layout = qobject_cast<QHBoxLayout *>(ui->hmenuwidget->layout());

        // 添加报警按钮
        layout->addWidget(alarmBtn);

        // 在报警按钮右侧添加一个spacer，腾出空间
        QSpacerItem *alarmSpacer = new QSpacerItem(20, 0, QSizePolicy::Fixed, QSizePolicy::Minimum);
        layout->addItem(alarmSpacer);

        // 关联点击事件
        connect(alarmBtn, &QPushButton::clicked, [=]
                { ui->contentStackedWidget->setCurrentWidget(menuWidget); });

        // 如果初始报警数为0，则隐藏按钮
        if (initialText == "0" || initialText.isEmpty())
        {
            alarmBtn->setVisible(false);
        }
    }
}

/**
 * @brief displaywidget::updateAlarmButtonText 更新报警按钮显示的文字
 * @param iconName 图标文件名
 * @param text 要显示的新文字
 */
void displaywidget::updateAlarmButtonText(const QString &iconName, const QString &text)
{
    if (m_menuButtonsMap.contains(iconName))
    {
        QPushButton *alarmBtn = m_menuButtonsMap[iconName];
        alarmBtn->setText(QString("报警:%1").arg(text));

        // 如果报警数量为0，则隐藏按钮；否则显示按钮
        if (text == "0" || text.isEmpty())
        {
            alarmBtn->setVisible(false);
        }
        else
        {
            alarmBtn->setVisible(true);
        }
    }
    else
    {
        qDebug() << "未找到名为" << iconName << "的报警按钮";
    }
}

void displaywidget::insert_project_menuWidget(QString menuPath, QWidget *menuWidget)
{
    if (menuWidget)
    {
        // 为内容页强制添加垂直布局
        if (!menuWidget->layout())
        {
            QVBoxLayout *vLayout = new QVBoxLayout(menuWidget);
            vLayout->setContentsMargins(0, 0, 0, 0);
            vLayout->setSpacing(0);
            menuWidget->setLayout(vLayout);
        }
        // 添加主内容页
        ui->contentStackedWidget->addWidget(menuWidget);
        ui->contentStackedWidget->setCurrentWidget(menuWidget); // 直接显示目的是完成布局计算

        // 创建菜单按钮
        QPushButton *menuBtn = new QPushButton();
        menuBtn->setFixedSize(140, 32);
        menuBtn->setFlat(true);      // 透明背景
        menuBtn->setCheckable(true); // 设置为可选中状态

        // 添加属性标记，用于区分菜单按钮和普通按钮
        menuBtn->setProperty("hmenuButton", true);

        // 设置按钮文字（从文件名提取）
        QFileInfo fileInfo(menuPath);
        QString buttonText = fileInfo.baseName(); // 获取不带扩展名的文件名
        menuBtn->setText(buttonText);
        // 加载图标并缩放
        QPixmap pix(menuPath);
        menuBtn->setIcon(pix.scaled(24, 24, Qt::KeepAspectRatio, Qt::SmoothTransformation));
        menuBtn->setIconSize(QSize(24, 24));

        // 获取图标名称作为 key（取路径最后部分）
        QString iconName = QFileInfo(menuPath).fileName(); // 如 "主页.png"
        // 存入 map，便于后续查找
        m_menuButtonsMap[iconName] = menuBtn;

        // 在拉伸项前插入按钮
        QHBoxLayout *layout = qobject_cast<QHBoxLayout *>(ui->hmenuwidget->layout());
        layout->insertWidget(layout->count() - 1, menuBtn);

        // 关联按钮点击显示对应页面
        connect(menuBtn, &QPushButton::clicked, [=]()
                {
                    // 取消之前选中按钮的选中状态
                    if (currentMenuButton && currentMenuButton != menuBtn) {
                        currentMenuButton->setChecked(false);
                    }
                    // 设置当前按钮为选中状态
                    menuBtn->setChecked(true);
                    currentMenuButton = menuBtn;

                    ui->contentStackedWidget->setCurrentWidget(menuWidget); });

        // 设置第一个按钮为默认选中状态
        if (!currentMenuButton)
        {
            menuBtn->setChecked(true);
            currentMenuButton = menuBtn;
        }

        // 每次添加新按钮后重新排序
        reorderMenuButtons();
    }
}

/**
 * @brief displaywidget::reorderMenuButtons 根据预定义顺序重新排列菜单按钮
 */
void displaywidget::reorderMenuButtons()
{
    // 定义期望的按钮顺序
    QStringList buttonOrder = {
        "主页总览.png", // 第一个
        "事件记录.png",
        "系统设置.png", // 第二个
        "设备设置.png", // 第三个
        "详细.png"      // 第四个
    };

    QHBoxLayout *layout = qobject_cast<QHBoxLayout *>(ui->hmenuwidget->layout());
    if (!layout)
        return;

    // 获取当前所有按钮
    QList<QPushButton *> buttons;
    QMap<QString, QPushButton *> orderedButtons;

    // 从map中获取所有按钮
    for (auto it = m_menuButtonsMap.constBegin(); it != m_menuButtonsMap.constEnd(); ++it)
    {
        orderedButtons[it.key()] = it.value();
    }

    // 移除所有按钮（除了stretch）
    QLayoutItem *stretchItem = nullptr;
    while (QLayoutItem *item = layout->takeAt(0))
    {
        if (item->spacerItem())
        {
            stretchItem = item; // 保存stretch项
        }
        else if (QWidget *widget = item->widget())
        {
            // 按钮会被重新添加，这里不需要删除
        }
        // 注意：不要删除item，因为按钮还在orderedButtons中
    }

    // 按照指定顺序重新添加按钮
    for (const QString &iconName : buttonOrder)
    {
        if (orderedButtons.contains(iconName))
        {
            layout->addWidget(orderedButtons[iconName]);
            orderedButtons.remove(iconName); // 移除已处理的按钮
        }
    }

    // 添加剩余的按钮（不在预定义顺序中的按钮）
    for (auto it = orderedButtons.constBegin(); it != orderedButtons.constEnd(); ++it)
    {
        layout->addWidget(it.value());
    }

    // 重新添加stretch项（确保按钮靠左）
    if (stretchItem)
    {
        layout->addItem(stretchItem);
    }
}

/**
 * @brief displaywidget::switchToPageByIconName 通过图标名称切换到指定页面
 * @param iconName 图标文件名（如 "主页.png"）
 */
void displaywidget::switchToPageByIconName(const QString &iconName)
{
    // 检查图标名称是否存在
    if (m_menuButtonsMap.contains(iconName))
    {
        // 获取与图标关联的按钮
        QPushButton *button = m_menuButtonsMap[iconName];

        // 查找按钮对应的页面widget
        for (int i = 0; i < ui->contentStackedWidget->count(); ++i)
        {
            QWidget *widget = ui->contentStackedWidget->widget(i);

            // 遍历widget的所有子对象，查找与按钮关联的信号槽连接
            QList<QObject *> children = widget->children();
            for (QObject *child : children)
            {
                // 如果找到与按钮点击信号连接的widget，则切换到该页面
                if (widget == ui->contentStackedWidget->currentWidget())
                {
                    continue;
                }

                // 更直接的方法：通过按钮的clicked信号关联查找对应页面
                // 这里简化处理，直接使用按钮索引查找对应页面
            }
        }

        // 触发按钮点击事件来切换页面（复用已有的连接逻辑）
        button->click();
    }
    else
    {
        qDebug() << "未找到名为" << iconName << "的菜单按钮";
    }
}

void displaywidget::setMenuWidgetVisibleByName(const QString &iconName, bool visible)
{
    if (m_menuButtonsMap.contains(iconName))
    {
        m_menuButtonsMap[iconName]->setVisible(visible);
    }
    else
    {
        qDebug() << "未找到名为" << iconName << "的菜单按钮";
    }
}

/**
 * @brief displaywidget::insert_menu_pix 根据当前选择哪个菜单栏,往哪个菜单栏插入图标和按钮
 * @param menuPath
 */
void displaywidget::insert_menu_pix(QString menuPath)
{
    switch (menuType)
    {
    case UI_H_MENU:
        initHmenu();
        break;
    case UI_V_MENU:
        initVmenu();
        break;
    default:
        break;
    }
}

void displaywidget::on_toggleButton_clicked()
{
    bool isHidden = (ui->menuWidget->width() == 0);
    QPropertyAnimation *menuAnimation = new QPropertyAnimation(ui->menuWidget, "geometry");
    QPropertyAnimation *contentAnimation = new QPropertyAnimation(ui->contentHWidget, "geometry");
    menuAnimation->setDuration(300);
    contentAnimation->setDuration(300);
    menuAnimation->setEasingCurve(QEasingCurve::InOutQuad);
    contentAnimation->setEasingCurve(QEasingCurve::InOutQuad);

    QRect menuRect = ui->menuWidget->geometry();
    QRect contentRect = ui->contentHWidget->geometry();

    if (isHidden)
    {
        // 展开菜单栏
        menuRect.setWidth(menuWidth);
        contentRect.setX(menuWidth);
    }
    else
    {
        // 折叠菜单栏
        menuRect.setWidth(0);
        contentRect.setX(0);
    }
    menuAnimation->setStartValue(ui->menuWidget->geometry());
    menuAnimation->setEndValue(menuRect);
    contentAnimation->setStartValue(ui->contentHWidget->geometry());
    contentAnimation->setEndValue(contentRect);

    menuAnimation->start(QAbstractAnimation::DeleteWhenStopped);
    contentAnimation->start(QAbstractAnimation::DeleteWhenStopped);
}